package pe.bn.WSServiceHost.serHost.model;


//import java.io.DataOutputStream;
import javax.xml.rpc.holders.StringHolder;

import java.util.Hashtable;
import pe.bn.WSServiceHost.serHost.interactive.WSConnect;
import org.apache.log4j.Logger;

public class WSCronogramaPago {

	private static Logger log = Logger.getLogger(WSCronogramaPago.class.getName());
	private HeadRequest cabeceraRequest;
	private BodyCronogramaPago body;
	
	public WSCronogramaPago(HeadRequest cab,BodyCronogramaPago input) {
		super();
		cabeceraRequest = cab;
		body = input;
	}
	
	public Hashtable EjecutarTramaHost(
			) throws Exception {
		
		//int result = 9999;
		
		Hashtable crono = new Hashtable(); 
		
		//Determinando las veces a consultar el host
		int totalDias = Integer.parseInt(body.getByTag("PLAZO-PAGO")); 
		
		double tmpVeces = totalDias/body.getNumeroCuotas();
		
		long tmpdecimales = totalDias%body.getNumeroCuotas();
		
		long numVeces = 0;
		if(tmpdecimales != 0){
			numVeces = Math.round(tmpVeces)+1;
		}else{
			numVeces = Math.round(tmpVeces);
		}
		
		BodyCronogramaPago body1 = new BodyCronogramaPago();
		body1.initCronograma();
		BodyCronogramaPago.LCronograma lcron1 =  body1.getLcron();
		BodyCronogramaPago body2 = null;
		HeadRespose cab1 = null;
		
		for(int i=0;i<numVeces;i++){

			body.setByTag("PER-INICIAL",String.valueOf((i*body.getNumeroCuotas())+1));
			body.setByTag("CANT-PER",Integer.toString(body.getNumeroCuotas()));
			
			cab1 = new HeadRespose(); 
			body2 = EjecutarTramaHostHilo(cab1);
			if(body2!=null){
				BodyCronogramaPago.LCronograma out1 = body2.getLcron();
				if(out1!=null){
					for(int y=0;y<out1.size();y++){
						if(out1.get(y) != null)
							lcron1.add(out1.get(y));
					}
				}
			}else{
				crono.put("head",cab1);
				//body2 =  new BodyCronogramaPago();
				body2.setLcron(lcron1);
				crono.put("body",body2);
				return crono;
			}	
		}
		crono.put("head",cab1);
		//body2 =  new BodyCronogramaPago();
		body2.setLcron(lcron1);
		crono.put("body",body2);
		return crono;
	}
	
	public BodyCronogramaPago EjecutarTramaHostHilo(  
			HeadRespose cabeceraRespose
			) throws Exception {
		
		String cadenaHost = new String();
		StringHolder cadenaResult = new StringHolder();		
		WSConnect wsConnect  =  new WSConnect();
		cadenaHost = cabeceraRequest.toString() + body.toString() ;
		int result = 9999;
		BodyCronogramaPago outPut1 = new BodyCronogramaPago();
		
		result =  wsConnect.EjecutarTramaHost(cadenaHost,cadenaResult);
		
		int longitudHead = cabeceraRequest.LongitudTrama();
		int longitudresult =cadenaResult.value.trim().length();
		
		if (longitudresult >= longitudHead){
			String HeadResult = cadenaResult.value.trim().substring(0,longitudHead);
			cabeceraRespose.FillCabecera(HeadResult);
		}else{
			cabeceraRespose = null;
			return null;
		};
		
		
		if(cabeceraRespose.getByTag("COD-RET").equals("00000")){
			int longBodyHead = body.LongitudTrama();
			int longBodyList = body.LongitudTramaList();

			
			long verifBody = (longitudresult - (longitudHead + longBodyHead))%body.LongitudTramaCuota();
			
			//long longBody = (longitudHead + longBodyHead)%body.LongitudTramaCuota();
			/*if(verifBody != 0){
				return null;
			}*/
			
			if ( longitudresult >= longitudHead+longBodyHead+longBodyList){
				String BodyResult = cadenaResult.value.substring(longitudHead,longitudresult);
		
				
				outPut1.FillBoby(BodyResult);
				}else{
					return null;
				};
		}else{
			return null;			
		}
		return outPut1;
	}

}
